/******************************************************************************
 *  _____     _____
 *  \  __\    \  __\
 *   \ \_\\    \ \_\\
 *    \  __\SS  \  __\roject
 *     \_\       \_\
 *
 * Mateusz Maciąg, Rafał Urbański
 * Komputerowe Systemy Sterowania
 *****************************************************************************/

/** \mainpage

\code
                              _____     _____
                              \  __\    \  __\
                               \ \_\\    \ \_\\
                                \  __\SS  \  __\roject
                                 \_\       \_\

                             Mateusz Maciąg, Rafał Urbański
                             Komputerowe Systemy Sterowania
\endcode

<h1> Dokumentacja ćwiczeń laboratoryjnych PSS </h1>

Niniejsza dokumentacja została wygenerowana w systemie dokumentowania Doxygen.
Zawiera opis klas oraz interfejsów napisanych w trakcie laboratorium. W szczególności
opisane zostały części publiczne i chronione klas.

<h2> Dodatkowe odnośniki </h2>

-# \ref conf_files

<h2> Autorzy </h2>
Mateusz Maciąg, Rafał Urbański - studenci Automatyki i Robotyki, specjalność Komputerowe
Systemy Sterowania.

*/

/** \page conf_files Pliki konfiguracyjne
  Konfiguracja symulatora może być zapisana i odczytana z pliku tekstowego.

  Określona została składnia, którą najprościej przedstawić na przykładowo
  wygenerowanym pliku konfiguracyjnym:

  \todo Naprawić bug przy wysyłaniu konfiguracji StepWaveform.

\code
; Rafał Urbański, Mateusz Maciąg
; Komputerowe Systemy Sterowania



; Plik konfiguracyjny symulatora PSSProject. Zawiera pełną konfigurację
; parametrów symulacji, włączając w to konfigurację wejść, regulatora,
; obiektów dynamicznych oraz ich parametrów.

; Konfiguracja składa się z bloków na wzór XML. Blok główny to
; [Simulation <nazwa>][/Simulation]. W nim zawarte są pozostałę bloki oraz
; parametry. Dozwolone podbloki to [Input <nazwa>], [Controller <nazwa>] oraz
; [Model <nazwa>]. Blok [Controller] może wystąpić tylko jednokrotnie.
; Kolejność modeli ma znaczenie, gdyż decyduje o ułożeniu w łańcuchu
; szeregowym. Dla pozostałych bloków kolejność nie ma znaczenia.

{ Simulation Symulator }     ; Blok konfiguracujny symulatora

; Blok [Model <nazwa>] definiuje parametry modelu, włącznie z tymi
; niestacjonarnymi. Składa się z bloków [Params <nazwa>] definiujących
; parametry stacjonarne modelu oraz chwila, od której obowiązują.
; Dopuszczalne parametry to: apoly, bpoly delay i switch_time. apoly i bpoly
; są wielomianami podawanymi wg składni [ a0 a1 ... an ]. Pozostałe
; parametry posiadają składnię liczb zmiennoprzecinkowych.

    { Model Test }
        max_adegree = 5
        max_bdegree = 3
        max_delay = 6

        { Params TestParam1 }
            delay = 2
            bpoly = [ 100 -90 ]
            apoly = [ 100 90 ]
            switch_time = 250
        {/ Params }
    {/ Model }
    { Model LP1 }
        max_adegree = 1
        max_bdegree = 1
        max_delay = 1

        { Params LP1 }
            delay = 0
            bpoly = [ 0 6.7 ]
            apoly = [ 100 -90 ]
            switch_time = -1
        {/ Params }
    {/ Model }

; Blok [Controller <nazwa>] specyfikuje rodzaj regulatora w zamkniętej pętli
; regulacji. Blok nie posiada bloków zagnieżdżonych, za to obowiązkowo musi
; zawierać parametr type definiujący typ regulatora. Wartość default
; oznacza regulator specjalny czyniący układ otwartym.

    { Controller GPCController }
        type = GPC
        h = 7      ; Horyzont predykcji.
        l = 4      ; Horyzont sterowania.
        rho = 0.7
        alpha = 0.8          ; Dynamika modelu odniesienia.
        da = 2
        db = 2
        dly = 0
        gain = 0.2
    {/ Controller }

; Blok [Input <nazwa>] zawiera definicję wejścia zadawania. Nie posiada
; bloków zagnieżdżonych za to definiuje parametry charakterystyczne dla
; rodzaju wejścia. Ów rodzaj definiowany jest obligatoryjnym parametrem type.

    { Input Square }
        type = square
        duty = 0.5
        gain = 0.5
        period = 25
        offset = 0
        phase = 0
    {/ Input }
    { Input Sine }
        type = sine
        gain = 1
        period = 25
        offset = 0
        phase = 0
    {/ Input }
    { Input Triangle }
        type = triangle
        gain = 1
        period = 25
        offset = 0
        phase = 0
    {/ Input }
    { Input Kronecker }
        type = kronecker
        init_val = 0
        action_time = 25
        action_val = 1
    {/ Input }
    init_val = 0
    action_time = 25
    action_val = 1
    { Input Random }
        type = random
        variance = 1
    {/ Input }
{/ Simulation }
\endcode

Uzupełniając składnię podajemy jeszcze sekwencję ustawień dla regulatorów
P, PID oraz OpenLoop:

\code
    { Controller PIDController }
        type = PID
        gain = 1   ; Wzmocnienie regulatora.
        b = 1      ; Wzmocnienie wejścia zadawanego (1.0 - uchyb liczony tradycyjnie).
        ti = 0     ; Czas zdwojenia (liczony w próbkach!)
        td = 0     ; Czas wyprzedzenia (także w próbkach!)
        n = 10     ; Współczynnik inercji części różniczkującej.
        upper_bound = 2000   ; Górny próg nasycenia.
        lower_bound = -2000  ; Dolny próg nasycenia.
    {/ Controller }
\endcode

\code

    { Controller GainController }
        type = P   ; Regulator proporcjonalny
        gain = 1   ; Wzmocnienie regulatora
    {/ Controller }
\endcode

\code
    { Controller OLController }
        type = default       ; Otwarta pętla sprzężenia.
    {/ Controller }
\endcode
*/


// Brakujące opisy przestrzeni nazw.
/** \namespace RafMat
  Przestrzeń nazw zespołu Rafał & Mateusz.
*/

/** \namespace RafMat::SimEngine
  Przestrzeń nazw zawierająca implementację silnika symulatora oraz powiązane
  z nim elementy.
*/

/** \namespace RafMat::SimInterface
  Przestrzeń nazw definiująca interfejs oraz "punkty styku" pomiędzy klasami symulatora,
  a interfejsem graficznym użytkownika.
*/

/** \namespace RafMat::SimFile
  Przestrzeń nazw, w której implementuje się operacje plikowe takie jak odczyt i zapis
  konfiguracji z/do pliku.
*/

/** \namespace RafMat::UI
  Przestrzeń nazw, w której zawarto klasy bezpośrednio związane z interfejsem graficznym
  użytkownika.
*/
